﻿package com.tools
{
	import flash.net.URLRequest;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.display.LoaderInfo;
	import flash.display.DisplayObjectContainer;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import flash.events.IOErrorEvent;
	
	import com.tools.notifications.SkinEvent;
	
	import com.datasource.ElementSkinVO;
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// SkinLoader ::
	// - conteneur graphique d'un élément de la skin
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class SkinLoader extends Sprite
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// propriété qui stocke tous les attributs de l'élément de skin
		private var _skinProperties	: ElementSkinVO;
		
		// conteneur du loader
		private var skinContainer	: Sprite;
		// loader de l'élément
		private var skinLoader 		: Loader;
		// LoaderInfo utiliser pour extraire les données du loader
		private var sli				: LoaderInfo;
		
		// propriétés utiles au suivi du chargement de l'élément
		private var _initialized	: Boolean = false;
		private var _loaded			: Boolean = false;
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function SkinLoader ( skinProps : ElementSkinVO )
		{
			if ( loaded ) loaded = false;
			skinProperties = skinProps;
			initialized = true;
			init( skinProperties );			
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PUBLIQUES : INITIALISATION DU CHARGEMENT
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function init( sProp : ElementSkinVO )
		{
			var requete:URLRequest = new URLRequest();
			// on set les properties de la skin à charger
			requete.url 	= sProp.skinSourceURL;
			trace( "A charger :::::: " + sProp.skinSourceURL );
				
			// on charge la skin
			skinLoader = new Loader( );
			skinLoader.load( requete );
			sli = skinLoader.contentLoaderInfo;
			sli.addEventListener ( Event.INIT, initLoading );
			sli.addEventListener ( Event.OPEN, beginLoading );
			sli.addEventListener ( ProgressEvent.PROGRESS, loading );
			sli.addEventListener ( Event.COMPLETE, loadingComplete );
			sli.addEventListener ( IOErrorEvent.IO_ERROR, loadingFailed );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PRIVEES : GESTIONNAIRES DE CHARGEMENT
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private function beginLoading ( pEvt : Event ):void
		{
			trace ("démarre chargement");
		}
		
		private function loading ( pEvt : ProgressEvent ):void
		{
			trace ("chargement en cours");
		}
		
		private function loadingComplete ( pEvt : Event ):void
		{
			initialized = false;
			loaded = true;
			
			var cut : Array = skinProperties.skinName.split( "_" );
			var prefix : String = cut[1];
			
			//pEvt.target.content.parent.name = skinProperties.skinName;
			
			trace( "\nCE QUE PRODUIT LE LOADER :\n---" );
			//trace( "gd parent : " + pEvt.target.content.parent.parent + " / name -> " + pEvt.target.content.parent.parent.name );
			trace( "parent : " + pEvt.target.content.parent + " / name -> " + pEvt.target.content.parent.name );
			trace( "c. : " + pEvt.target.content + " / name -> " + pEvt.target.content.name + " / skPp : " + skinProperties.skinName + "\n---\n" );
			//pEvt.target.content.name	= prefix;
			
			pEvt.target.content.width 	= skinProperties.skinWidth;
			pEvt.target.content.height 	= skinProperties.skinHeight;
			pEvt.target.content.x 		= skinProperties.skinX;
			pEvt.target.content.y 		= skinProperties.skinY;
			
			
			
			addChild( pEvt.target.content );
			
			dispatchEvent ( new SkinEvent ( SkinEvent.ELEMENT_COMPLETE, true, false ) );
		}
		
		private function initLoading ( pEvt : Event ):void
		{
			trace ("initialisation du chargement");
		}
		
		private function loadingFailed ( pEvt : IOErrorEvent ):void
		{
			trace ("erreur de chargement SkinLoader : " + pEvt.text + "\n");
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// GETTER & SETTER
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function get skinProperties ( ) : ElementSkinVO
		{
			return _skinProperties;
		}
		
		public function set skinProperties ( val : ElementSkinVO) : void
		{
			_skinProperties = val;
		}
		
		public function get initialized ( ) : Boolean
		{
			return _initialized;
		}
		
		public function set initialized ( pBoo : Boolean ) : void
		{
			_initialized = pBoo;
		}
		
		public function get loaded ( ) : Boolean
		{
			return _loaded;
		}
		
		public function set loaded ( pBoo : Boolean ) : void
		{
			_loaded = pBoo;
		}
	}
}